--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_lxmf_propagation_full.py v4.6.0-rc.2 (7bbe9846) Text, 13.47 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787json
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787types Tff7b72import Te6edf3SimpleNamespace
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787pytest
Tff7b72import T7ee787RNS
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
T8b949e# Store original constants
Te6edf3PR_IDLE Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLE
Te6edf3PR_PATH_REQUESTED Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_PATH_REQUESTED
Te6edf3PR_PATH_TIMEOUT Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_PATH_TIMEOUT
Te6edf3PR_RECEIVING Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RECEIVING
Te6edf3PR_COMPLETE Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETE
Te6edf3PR_FAILED Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_FAILED
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8fftemp_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3dir_path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3dir_path
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3dir_pathTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_appTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.ReticulumTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_rnsTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.TransportTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffLXMF.LXMRouterTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_router_classTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.get_file_pathTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ff/tmp/mock_pathTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.generate_ssl_certificateTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e# Set up constants on the mock class
Te6edf3mock_router_classTff7b72.Td2a8ffPR_IDLE Tff7b72= Te6edf3PR_IDLE
Te6edf3mock_router_classTff7b72.Td2a8ffPR_PATH_REQUESTED Tff7b72= Te6edf3PR_PATH_REQUESTED
Te6edf3mock_router_classTff7b72.Td2a8ffPR_PATH_TIMEOUT Tff7b72= Te6edf3PR_PATH_TIMEOUT
Te6edf3mock_router_classTff7b72.Td2a8ffPR_RECEIVING Tff7b72= Te6edf3PR_RECEIVING
Te6edf3mock_router_classTff7b72.Td2a8ffPR_COMPLETE Tff7b72= Te6edf3PR_COMPLETE
Te6edf3mock_router_classTff7b72.Td2a8ffPR_FAILED Tff7b72= Te6edf3PR_FAILED
Te6edf3mock_router Tff7b72= Te6edf3mock_router_classTff7b72.Td2a8ffreturn_value
Te6edf3mock_routerTff7b72.Td2a8ffPR_IDLE Tff7b72= Te6edf3PR_IDLE
Te6edf3mock_routerTff7b72.Td2a8ffPR_PATH_REQUESTED Tff7b72= Te6edf3PR_PATH_REQUESTED
Te6edf3mock_routerTff7b72.Td2a8ffPR_PATH_TIMEOUT Tff7b72= Te6edf3PR_PATH_TIMEOUT
Te6edf3mock_routerTff7b72.Td2a8ffPR_RECEIVING Tff7b72= Te6edf3PR_RECEIVING
Te6edf3mock_routerTff7b72.Td2a8ffPR_COMPLETE Tff7b72= Te6edf3PR_COMPLETE
Te6edf3mock_routerTff7b72.Td2a8ffPR_FAILED Tff7b72= Te6edf3PR_FAILED
Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3PR_IDLE
Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72= T79c0ff0.0
Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_last_result Tff7b72= T79c0ff0
Te6edf3mock_dest Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6fflocal_dest_hash_16bTa5d6ff"
Te6edf3mock_destTff7b72.Td2a8ffhexhash Tff7b72= Ta5d6ff"Ta5d6ff6c6f63616c5f646573745f686173685fTa5d6ff"
Te6edf3mock_routerTff7b72.Td2a8ffregister_delivery_identityTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_dest
Te6edf3mock_rns_inst Tff7b72= Te6edf3mock_rnsTff7b72.Td2a8ffreturn_value
Te6edf3mock_rns_instTff7b72.Td2a8fftransport_enabledTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.meshchat_utils.LXMRouterTa5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3mock_utils_routerTb4b4b4:
Te6edf3mock_utils_routerTff7b72.Td2a8ffPR_IDLE Tff7b72= Te6edf3PR_IDLE
Te6edf3mock_utils_routerTff7b72.Td2a8ffPR_PATH_REQUESTED Tff7b72= Te6edf3PR_PATH_REQUESTED
Te6edf3mock_utils_routerTff7b72.Td2a8ffPR_PATH_TIMEOUT Tff7b72= Te6edf3PR_PATH_TIMEOUT
Te6edf3mock_utils_routerTff7b72.Td2a8ffPR_RECEIVING Tff7b72= Te6edf3PR_RECEIVING
Te6edf3mock_utils_routerTff7b72.Td2a8ffPR_COMPLETE Tff7b72= Te6edf3PR_COMPLETE
Te6edf3mock_utils_routerTff7b72.Td2a8ffPR_FAILED Tff7b72= Te6edf3PR_FAILED
Te6edf3real_id Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3real_idTb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_router Tff7b72= Te6edf3mock_router
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3appTb4b4b4,
Ta5d6ff"Ta5d6ffsend_config_to_websocket_clientsTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72yield Te6edf3app
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_lxmf_propagation_configTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3node_hash_hex Tff7b72= Ta5d6ff"Ta5d6ffd81255ae2ff367d4883b16c9cc8c6178Ta5d6ff"
Te6edf3node_hash_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3node_hash_hexTb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(
Tb4b4b4{Ta5d6ff"Ta5d6fflxmf_preferred_propagation_node_destination_hashTa5d6ff"Tb4b4b4: Te6edf3node_hash_hexTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffset_outbound_propagation_nodeTff7b72.Td2a8ffassert_called_withTb4b4b4(
Te6edf3node_hash_bytesTb4b4b4,
Tb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72== Te6edf3node_hash_hex
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_lxmf_sync_flowTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_router Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_router
Te6edf3mock_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffsomehashTa5d6ff"
T8b949e# Trigger sync
Tff7b72for Te6edf3route Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3routeTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/syncTa5d6ff"Tb4b4b4:
Tff7b72await Te6edf3routeTff7b72.Td2a8ffhandlerTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72break
Te6edf3mock_routerTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
T8b949e# Check status (Receiving)
Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3PR_RECEIVING
Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72= T79c0ff0.75
Te6edf3status_handler Tff7b72= Tffa657nextTb4b4b4(
Te6edf3rTff7b72.Td2a8ffhandler
Tff7b72for Te6edf3r Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/statusTa5d6ff"
Tb4b4b4)
Te6edf3response Tff7b72= Tff7b72await Te6edf3status_handlerTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_node_statusTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffreceivingTa5d6ff"
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_node_statusTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff75.0
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_lxmf_sync_requests_path_before_syncTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_router Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_router
Te6edf3outbound Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffsomehashTa5d6ff"
Te6edf3mock_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3outbound
Te6edf3sync_handler Tff7b72= Tffa657nextTb4b4b4(
Te6edf3rTff7b72.Td2a8ffhandler
Tff7b72for Te6edf3r Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/syncTa5d6ff"
Tb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.RNS.Transport.has_pathTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.RNS.Transport.request_pathTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_requestTb4b4b4:
Tff7b72await Te6edf3sync_handlerTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3mock_requestTff7b72.Td2a8ffassert_called_withTb4b4b4(Te6edf3outboundTb4b4b4)
Te6edf3mock_routerTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTff7b72.Td2a8ffassert_called_withTb4b4b4(
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffidentity
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_lxmf_sync_completes_immediately_for_local_preferred_nodeTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_router Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_router
Te6edf3local_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6fflocal-prop-node-1Ta5d6ff"
Te6edf3mock_routerTff7b72.Td2a8ffpropagation_destination Tff7b72= Te6edf3SimpleNamespaceTb4b4b4(Tffa657hashTff7b72=Te6edf3local_hashTb4b4b4)
Te6edf3mock_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3local_hash
Te6edf3sync_handler Tff7b72= Tffa657nextTb4b4b4(
Te6edf3rTff7b72.Td2a8ffhandler
Tff7b72for Te6edf3r Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/syncTa5d6ff"
Tb4b4b4)
Tff7b72await Te6edf3sync_handlerTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72assert Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3PR_COMPLETE
Tff7b72assert Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72== T79c0ff1.0
Tff7b72assert Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_last_result Tff7b72== T79c0ff0
Te6edf3mock_routerTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_hosting_prop_nodeTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_router Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_router
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6fflxmf_local_propagation_node_enabledTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}Tb4b4b4)
Te6edf3mock_routerTff7b72.Td2a8ffenable_propagationTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6fflxmf_local_propagation_node_enabledTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}Tb4b4b4)
Te6edf3mock_routerTff7b72.Td2a8ffdisable_propagationTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_send_failed_via_prop_nodeTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_router Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_router
Te6edf3mock_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffactive_prop_nodeTa5d6ff"
T8b949e# Create a mock failed message with required attributes
Te6edf3mock_msg Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4)
Te6edf3mock_msgTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffFAILED
Te6edf3mock_msgTff7b72.Td2a8ffsource_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffsource_hash_16bTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffdestination_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffdest_hash_16bTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffmsg_hash_16bTa5d6ff"
Te6edf3mock_appTff7b72.Td2a8ffsend_failed_message_via_propagation_nodeTb4b4b4(Te6edf3mock_msgTb4b4b4)
Tff7b72assert Te6edf3mock_msgTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffPROPAGATED
Te6edf3mock_routerTff7b72.Td2a8ffhandle_outboundTff7b72.Td2a8ffassert_called_withTb4b4b4(Te6edf3mock_msgTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_auto_sync_interval_configTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(
Tb4b4b4{Ta5d6ff"Ta5d6fflxmf_preferred_propagation_node_auto_sync_interval_secondsTa5d6ff"Tb4b4b4: T79c0ff3600Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_preferred_propagation_node_auto_sync_interval_secondsTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72== T79c0ff3600
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_propagation_node_status_mappingTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_router Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_router
Te6edf3status_handler Tff7b72= Tffa657nextTb4b4b4(
Te6edf3rTff7b72.Td2a8ffhandler
Tff7b72for Te6edf3r Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/statusTa5d6ff"
Tb4b4b4)
Te6edf3states_to_test Tff7b72= Tb4b4b4[
Tb4b4b4(Te6edf3PR_IDLETb4b4b4, Ta5d6ff"Ta5d6ffidleTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Te6edf3PR_PATH_REQUESTEDTb4b4b4, Ta5d6ff"Ta5d6ffpath_requestedTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Te6edf3PR_PATH_TIMEOUTTb4b4b4, Ta5d6ff"Ta5d6ffpath_timeoutTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Te6edf3PR_RECEIVINGTb4b4b4, Ta5d6ff"Ta5d6ffreceivingTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Te6edf3PR_COMPLETETb4b4b4, Ta5d6ff"Ta5d6ffcompleteTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Te6edf3PR_FAILEDTb4b4b4, Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72for Te6edf3state_valTb4b4b4, Te6edf3state_str Tff7b72in Te6edf3states_to_testTb4b4b4:
Te6edf3mock_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3state_val
Te6edf3response Tff7b72= Tff7b72await Te6edf3status_handlerTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_node_statusTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3state_str
Tff7b72assert Ta5d6ff"Ta5d6fflocal_propagation_nodeTa5d6ff" Tff7b72in Te6edf3data
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_local_propagation_node_stop_and_restart_routesTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_router Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_router
Te6edf3mock_routerTff7b72.Td2a8ffpropagation_node Tff7b72= Tff7b72True
Te6edf3mock_routerTff7b72.Td2a8ffcompile_statsTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffuptimeTa5d6ff"Tb4b4b4: T79c0ff42Tb4b4b4,
Ta5d6ff"Ta5d6ffmessagestoreTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: T79c0ff3Tb4b4b4, Ta5d6ff"Ta5d6ffbytesTa5d6ff"Tb4b4b4: T79c0ff2048Tb4b4b4, Ta5d6ff"Ta5d6fflimitTa5d6ff"Tb4b4b4: T79c0ff4096Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffclient_propagation_messages_receivedTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffclient_propagation_messages_servedTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffpeer-aTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff"Tb4b4b4: T79c0ff1000Tb4b4b4, Ta5d6ff"Ta5d6fftx_bytesTa5d6ff"Tb4b4b4: T79c0ff600Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffpeer-bTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff"Tb4b4b4: T79c0ff300Tb4b4b4, Ta5d6ff"Ta5d6fftx_bytesTa5d6ff"Tb4b4b4: T79c0ff400Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffunpeered_propagation_rx_bytesTa5d6ff"Tb4b4b4: T79c0ff200Tb4b4b4,
Ta5d6ff"Ta5d6ffdelivery_limitTa5d6ff"Tb4b4b4: T79c0ff10Tb4b4b4,
Ta5d6ff"Ta5d6ffpropagation_limitTa5d6ff"Tb4b4b4: T79c0ff20Tb4b4b4,
Ta5d6ff"Ta5d6ffsync_limitTa5d6ff"Tb4b4b4: T79c0ff30Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_stamp_costTa5d6ff"Tb4b4b4: T79c0ff16Tb4b4b4,
Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffdiscovered_peersTa5d6ff"Tb4b4b4: T79c0ff2Tb4b4b4,
Ta5d6ff"Ta5d6fftotal_peersTa5d6ff"Tb4b4b4: T79c0ff3Tb4b4b4,
Ta5d6ff"Ta5d6ffmax_peersTa5d6ff"Tb4b4b4: T79c0ff10Tb4b4b4,
Tb4b4b4}
Te6edf3stop_handler Tff7b72= Tffa657nextTb4b4b4(
Te6edf3rTff7b72.Td2a8ffhandler
Tff7b72for Te6edf3r Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/stopTa5d6ff"
Tb4b4b4)
Te6edf3restart_handler Tff7b72= Tffa657nextTb4b4b4(
Te6edf3rTff7b72.Td2a8ffhandler
Tff7b72for Te6edf3r Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/restartTa5d6ff"
Tb4b4b4)
Te6edf3stop_response Tff7b72= Tff7b72await Te6edf3stop_handlerTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3stop_data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3stop_responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3stop_dataTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffLocal propagation node stoppedTa5d6ff"
Te6edf3local_stop Tff7b72= Te6edf3stop_dataTb4b4b4[Ta5d6ff"Ta5d6fflocal_propagation_nodeTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3local_stopTb4b4b4[Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1500
Tff7b72assert Te6edf3local_stopTb4b4b4[Ta5d6ff"Ta5d6fftx_bytesTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1000
Tff7b72assert Te6edf3local_stopTb4b4b4[Ta5d6ff"Ta5d6ffmessagestore_limit_bytesTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff4096
Tff7b72assert Te6edf3local_stopTb4b4b4[Ta5d6ff"Ta5d6ffclient_messages_receivedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff7
Te6edf3mock_routerTff7b72.Td2a8ffdisable_propagationTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Te6edf3restart_response Tff7b72= Tff7b72await Te6edf3restart_handlerTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3restart_data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3restart_responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3restart_dataTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffLocal propagation node restartedTa5d6ff"
Te6edf3local_restart Tff7b72= Te6edf3restart_dataTb4b4b4[Ta5d6ff"Ta5d6fflocal_propagation_nodeTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3local_restartTb4b4b4[Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1500
Tff7b72assert Te6edf3local_restartTb4b4b4[Ta5d6ff"Ta5d6fftx_bytesTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1000
Te6edf3mock_routerTff7b72.Td2a8ffenable_propagationTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_user_provided_node_hashTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
T8b949e"""Specifically test the node hash provided by the user."""
Te6edf3node_hash_hex Tff7b72= Ta5d6ff"Ta5d6ffd81255ae2ff367d4883b16c9cc8c6178Ta5d6ff"
T8b949e# Set this node as preferred
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.RNS.Transport.request_pathTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_request_pathTb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(
Tb4b4b4{Ta5d6ff"Ta5d6fflxmf_preferred_propagation_node_destination_hashTa5d6ff"Tb4b4b4: Te6edf3node_hash_hexTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3mock_request_pathTff7b72.Td2a8ffassert_called_withTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3node_hash_hexTb4b4b4)Tb4b4b4)
T8b949e# Check if the router was updated with the correct bytes
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffset_outbound_propagation_nodeTff7b72.Td2a8ffassert_called_withTb4b4b4(
Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3node_hash_hexTb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e# Trigger a sync request
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTff7b72.Td2a8ffreturn_value Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(
Te6edf3node_hash_hexTb4b4b4,
Tb4b4b4)
Te6edf3sync_handler Tff7b72= Tffa657nextTb4b4b4(
Te6edf3rTff7b72.Td2a8ffhandler
Tff7b72for Te6edf3r Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/syncTa5d6ff"
Tb4b4b4)
Tff7b72await Te6edf3sync_handlerTb4b4b4(Tff7b72NoneTb4b4b4)
T8b949e# Verify the router was told to sync for our identity
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTff7b72.Td2a8ffassert_called_withTb4b4b4(
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffidentityTb4b4b4,
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_destination_path_returns_local_hop_zero_for_local_destinationsTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3local_hash Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3path_handler Tff7b72= Tffa657nextTb4b4b4(
Te6edf3rTff7b72.Td2a8ffhandler
Tff7b72for Te6edf3r Tff7b72in Te6edf3mock_appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/destination/Tffd700{destination_hash}Ta5d6ff/pathTa5d6ff"
Tb4b4b4)
Te6edf3request Tff7b72= Te6edf3SimpleNamespaceTb4b4b4(
Te6edf3match_infoTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3local_hashTb4b4b4}Tb4b4b4,
Te6edf3queryTff7b72=Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3response Tff7b72= Tff7b72await Te6edf3path_handlerTb4b4b4(Te6edf3requestTb4b4b4)
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff0
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnext_hopTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3local_hash
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnext_hop_interfaceTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffLocalTa5d6ff"
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffpath_staleTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffpath_unresponsiveTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_convert_propagation_node_state_maps_all_lxmf_transfer_statesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787meshchat_utils Tff7b72import Tb4b4b4(
Te6edf3convert_propagation_node_state_to_stringTb4b4b4,
Tb4b4b4)
Te6edf3r Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouter
Te6edf3expected Tff7b72= Tb4b4b4{
Te6edf3rTff7b72.Td2a8ffPR_IDLETb4b4b4: Ta5d6ff"Ta5d6ffidleTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_PATH_REQUESTEDTb4b4b4: Ta5d6ff"Ta5d6ffpath_requestedTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_LINK_ESTABLISHINGTb4b4b4: Ta5d6ff"Ta5d6fflink_establishingTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_LINK_ESTABLISHEDTb4b4b4: Ta5d6ff"Ta5d6fflink_establishedTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_REQUEST_SENTTb4b4b4: Ta5d6ff"Ta5d6ffrequest_sentTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_RECEIVINGTb4b4b4: Ta5d6ff"Ta5d6ffreceivingTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_RESPONSE_RECEIVEDTb4b4b4: Ta5d6ff"Ta5d6ffresponse_receivedTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_COMPLETETb4b4b4: Ta5d6ff"Ta5d6ffcompleteTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_NO_PATHTb4b4b4: Ta5d6ff"Ta5d6ffno_pathTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_LINK_FAILEDTb4b4b4: Ta5d6ff"Ta5d6fflink_failedTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_TRANSFER_FAILEDTb4b4b4: Ta5d6ff"Ta5d6fftransfer_failedTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_NO_IDENTITY_RCVDTb4b4b4: Ta5d6ff"Ta5d6ffno_identity_receivedTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_NO_ACCESSTb4b4b4: Ta5d6ff"Ta5d6ffno_accessTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_FAILEDTb4b4b4: Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4,
Te6edf3rTff7b72.Td2a8ffPR_PATH_TIMEOUTTb4b4b4: Ta5d6ff"Ta5d6ffpath_timeoutTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72for Te6edf3state_valTb4b4b4, Te6edf3state_str Tff7b72in Te6edf3expectedTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3convert_propagation_node_state_to_stringTb4b4b4(Te6edf3state_valTb4b4b4) Tff7b72== Te6edf3state_str
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────